package leetcode.editor.cn;

//给定两个数组，编写一个函数来计算它们的交集。 
//
// 示例 1：
// 输入：nums1 = [1,2,2,1], nums2 = [2,2]
//输出：[2]
// 
// 示例 2：
// 输入：nums1 = [4,9,5], nums2 = [9,4,9,8,4]
//输出：[9,4] 
//
// 说明：
// 输出结果中的每个元素一定是唯一的。
// 我们可以不考虑输出结果的顺序。 
// 
// Related Topics 数组 哈希表 双指针 二分查找 排序 


import java.util.*;

public class T349IntersectionOfTwoArrays {
    public static void main(String[] args) {
        Solution solution = new T349IntersectionOfTwoArrays().new Solution();

        int[] num1 = {4, 9, 5};
        int[] num2 = {9, 4, 9, 8, 4};


        int[] ints = solution.intersection_1(num1, num2);
        int[] intss = solution.intersection_2(num1, num2);


    }
class Solution {
        //方法一：双循环
    public int[] intersection_1(int[] nums1, int[] nums2) {
        if (nums1.length == 0 || nums2.length == 0) {
            return new int[0];
        }
        Set<Integer> set = new HashSet<Integer>();
        for (int i : nums1) {
            for (int i1 : nums2) {
                if (i == i1) {
                    set.add(i);
                }
            }
        }
        int[] result = new int[set.size()];
        int i = 0;
        for (Integer integer : set) {
            result[i] = integer;
            ++i;
        }
        return result;
    }

    //利用set的特性
    public int[] intersection_2(int[] nums1, int[] nums2){
        if (nums1.length == 0 || nums2.length == 0) {
            return new int[0];
        }
        if (nums1.length > nums2.length) {
            intersection_2(nums2, nums1);
        }
        Set<Integer> set1 = new HashSet<Integer>();
        Set<Integer> set2 = new HashSet<Integer>();
        for (int i : nums1) {
            set1.add(i);
        }
        for (int i : nums2) {
            set2.add(i);
        }

        List<Integer> list = new ArrayList<>();
        for (Integer integer : set1) {
            if (set2.contains(integer)){
                list.add(integer);
            }
        }
        int[] result = new int[list.size()];
        int index = 0;
        for (Integer integer : list) {
            result[index++] = integer;
        }
        return result;
    }
}

}